/*
 * 本类作用：mina框架：IoHandlerAdapter（上一步：mina框架过滤器MinaServerIOFilter，下一步：mina框架过滤器MinaServerIOHandler）
 * messageReceived(),接收原始数据
 * 作者：袁小杰
 * 博客：http://blog.csdn.net/undoner
 * GIT：https://git.oschina.net/undoner
 * QQ：15137281
 * 
 */
package org.mina.server;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import org.apache.log4j.Logger;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.mina.business.Adapter;
import org.mina.business.InterfaceAnalysis;
import org.mina.mainFrame.DataReceiveFrame;
import org.mina.server.codec.MsgEntity;

public class MinaServerIOHandler extends IoHandlerAdapter {
	
	static Logger log = Logger.getRootLogger();
	
	public MinaServerIOHandler() {
		// TODO Auto-generated constructor stub
		log.debug(this.getClass().getName() + ":IOHandlerFilter");
	}

	@Override
	public void sessionCreated(IoSession session) throws Exception {
		log.debug(this.getClass().getName() + "连接创建 : " + session.getRemoteAddress()
				+ "  sessionId=" + session.getId());
	}

	// 当一个客户端连接进入时
	@Override
	public void sessionOpened(IoSession session) throws Exception {
		log.debug(this.getClass().getName() + "连接打开 : " + session.getRemoteAddress()
				+ "  sessionId=" + session.getId());
	}

	// 当一个客户端连接关闭时
	@Override
	public void sessionClosed(IoSession session) {
		log.debug(this.getClass().getName() + "连接关闭 : " + session.getRemoteAddress()
				+ "  sessionId=" + session.getId());
	}

	@Override
	public void sessionIdle(IoSession session, IdleStatus status)
			throws Exception {
		log.debug(this.getClass().getName() + "连接空闲 : " + session.getRemoteAddress() + "  sessionId=" + session.getId());
		session.close();
	}

	@Override
	public void messageSent(IoSession session, Object message) throws Exception {
		log.debug(String.format("向Server[%s]发送消息:%s",
				session.getRemoteAddress(), message.toString()));
	}

	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		// ---------------- 接收响应 开始 ---------------------
		// 使用解码器后，message对象就是数据实体对象了，直接强转
		MsgEntity reqME = (MsgEntity) message;
		log.debug(String.format("收到 终端 [%s] 数据:%s",
				session.getRemoteAddress(), reqME.getContent()));
		/*
		 * 输出结果到GUI面板中
		 */
		String dataTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").format(new Date());
		DataReceiveFrame.setTextArea(dataTime+"收到 终端:"+session.getRemoteAddress()+"数据:");
		DataReceiveFrame.setTextArea(reqME.getContent());
		
		
		// ---------------- 接收响应 结束 ---------------------

		// ---------------- 业务处理 开始 ---------------------
		
		//GPS测试数据；
		Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();
		System.out.println();
		System.err.println("当前线程数：" + map.size());
		//---------------- 适配器模式 ----------------
		String msg =reqME.getContent();
		String result = null;
		InterfaceAnalysis target = new Adapter();  
		if(msg.startsWith("13")){
			result = target.analyzeDataGps(reqME.getContent(),dataTime);  	
		}
		else{
			result = null;	
		}
	    target=null;	    
	    log.info(result==null?"Data Anaylysis Error":result);
		// ---------------- 业务处理 结束 ---------------------

		// ---------------- 发送响应 开始 ---------------------
		// 将消息返回给客户端，信息头四位是表示长度的二进制数，后边是true或false的字符串
		// 创建一个返回数据用的实体对象
		MsgEntity resME = new MsgEntity("OK");
		session.write(resME);
		// ---------------- 发送响应 结束 ---------------------
	}

	@Override
	public void exceptionCaught(IoSession session, Throwable cause)
			throws Exception {
		log.debug(this.getClass().getName() + "终端产生异常 : " + session.getRemoteAddress()
				+ "  sessionId=" + session.getId());
		session.close();
	}
}